package org.xtext.mydsl.validation

import java.util.List
import org.eclipse.emf.common.util.EList
import org.eclipse.emf.ecore.EReference
import org.eclipse.xtext.validation.Check
import org.xtext.mydsl.scheduler.Actividad
import org.xtext.mydsl.scheduler.Dicta
import org.xtext.mydsl.scheduler.SchedulerPackage
import org.xtext.mydsl.scheduler.impl.EspacioPCImpl
import org.xtext.mydsl.scheduler.impl.EspacioRegularImpl
import org.xtext.mydsl.scheduler.impl.TallerImpl

class ValidacionesEspacio extends MyAbstractValidator {
	
	public static val INVALID_NAME = 'invalidName'
	 
	 
	 @Check
	 def tallerSoloUsaAulaPC(Dicta it){
	 	if(espacio.class.equals(EspacioPCImpl) &&  !contieneActividadesTaller)
	 	"Las aulas de computadoras solo se usan para talleres".levantarMensajeDeError(
	 		SchedulerPackage.Literals.DICTA__ESPACIO)
	 }
	 
	 @Check
	 def aulasNormalesNoHayTaller(Dicta it){
	 	if(espacio.class.equals(EspacioRegularImpl) && contieneActividadesTaller )
	 		"Los espacios regulares no pueden ser usados para talleres".levantarMensajeDeError(
	 			SchedulerPackage.Literals.DICTA__ESPACIO)
	 }
	 
	 @Check
	 def espacioEsperadoVsEspacioMaximo(Dicta it){
	 	val cantidadEspacio = espacio.informacion.cant
	 	block.actividades.hayEspacioSuficiente(cantidadEspacio)	
	 	
	 }
	
//Extension methods
	def hayEspacioSuficiente(EList<Actividad> list, int i){
		list.forEach[
			if (informacion.numEspect > i){
				"Esta actividad excede la capacidad total del espacio."
				 .levantarMensajeDeError( SchedulerPackage.Literals.DICTA__ESPACIO)
			} else if (informacion.numEspect >= (i/2) && informacion.numEspect <= (i*0.9)){
				warning("Esta actividad ocupara entre el 50% y el 90% de la capacidad.",
					SchedulerPackage.Literals.DICTA__ESPACIO)
			} 
		]
	}
	 
	 def contieneActividadesTaller(Dicta it){
	 	block.actividades.checkifContainsTaller
	 }
	 
	 def checkifContainsTaller(List<Actividad> actividades){
	 	actividades.forall[class.equals(TallerImpl)]
	 }
	 	
	 
	 def levantarMensajeDeError(String msj, EReference referencia){
	 	error(msj, referencia, INVALID_NAME)	
	 }
	
}